package com.fiberhome.nas.core.network.di

import com.fiberhome.nas.core.network.datasource.album.AlbumNetworkDataSource
import com.fiberhome.nas.core.network.datasource.album.AlbumNetworkDataSourceImpl
import com.fiberhome.nas.core.network.datasource.auth.AuthNetworkDataSource
import com.fiberhome.nas.core.network.datasource.auth.AuthNetworkDataSourceImpl
import com.fiberhome.nas.core.network.datasource.common.CommonNetworkDataSource
import com.fiberhome.nas.core.network.datasource.common.CommonNetworkDataSourceImpl
import com.fiberhome.nas.core.network.datasource.page.PageNetworkDataSource
import com.fiberhome.nas.core.network.datasource.page.PageNetworkDataSourceImpl
import com.fiberhome.nas.core.network.datasource.photo.PhotoNetworkDataSource
import com.fiberhome.nas.core.network.datasource.photo.PhotoNetworkDataSourceImpl
import com.fiberhome.nas.core.network.datasource.userinfo.UserInfoNetworkDataSource
import com.fiberhome.nas.core.network.datasource.userinfo.UserInfoNetworkDataSourceImpl
import com.fiberhome.nas.core.network.service.AlbumService
import com.fiberhome.nas.core.network.service.AuthService
import com.fiberhome.nas.core.network.service.CommonService
import com.fiberhome.nas.core.network.service.PageService
import com.fiberhome.nas.core.network.service.PhotoService
import com.fiberhome.nas.core.network.service.UserInfoService
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import javax.inject.Singleton

/**
 * 数据源模块，提供所有网络数据源的依赖注入
 * 为Hilt提供各种网络数据源的实例
 */
@Module
@InstallIn(SingletonComponent::class)
object DataSourceModule {

    /**
     * 提供页面相关网络数据源
     *
     * @param pageService 页面服务接口
     * @return 页面网络数据源实现
     */
    @Provides
    @Singleton
    fun providePageNetworkDataSource(pageService: PageService): PageNetworkDataSource {
        return PageNetworkDataSourceImpl(pageService)
    }

    /**
     * 提供认证相关网络数据源
     *
     * @param authService 认证服务接口
     * @return 认证网络数据源实现
     */
    @Provides
    @Singleton
    fun provideAuthNetworkDataSource(authService: AuthService): AuthNetworkDataSource {
        return AuthNetworkDataSourceImpl(authService)
    }

    /**
     * 提供用户信息相关网络数据源
     *
     * @param userInfoService 用户信息服务接口
     * @return 用户信息网络数据源实现
     */
    @Provides
    @Singleton
    fun provideUserInfoNetworkDataSource(userInfoService: UserInfoService): UserInfoNetworkDataSource {
        return UserInfoNetworkDataSourceImpl(userInfoService)
    }

    /**
     * 提供通用基础网络数据源
     *
     * @param commonService 通用基础服务接口
     * @return 通用基础网络数据源实现
     */
    @Provides
    @Singleton
    fun provideCommonNetworkDataSource(commonService: CommonService): CommonNetworkDataSource {
        return CommonNetworkDataSourceImpl(commonService)
    }

    /**
     * 提供照片相关网络数据源
     *
     * @param photoService 照片服务接口
     * @return 照片网络数据源实现
     */
    @Provides
    @Singleton
    fun providePhotoNetworkDataSource(photoService: PhotoService): PhotoNetworkDataSource {
        return PhotoNetworkDataSourceImpl(photoService)
    }


    /**
     * 提供相册相关网络数据源
     *
     * @param albumService 相册服务接口
     * @return 相册网络数据源实现
     */
    @Provides
    @Singleton
    fun provideAlbumNetworkDataSource(albumService: AlbumService): AlbumNetworkDataSource {
        return AlbumNetworkDataSourceImpl(albumService)
    }
}